//============================================================================
// Copyright (C) 2009-2013 Brett R. Jones 
// All Rights Reserved
//
// You may redistribute and/or modify for non commercial and commercial uses 
// provided this copyright notice remains in place and is not modified
//
// This code is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//
// brettjones1900@gmail.com
// http://www.p2panarchy.com
//============================================================================

#include "RcSysSktMgrLib.h"

#define MAX_RC_SYS_SKT_EVENTS 20

//============================================================================
//=== constructor ===//
RcSysRxEvent::RcSysRxEvent()
	: m_poSkt(0)
	, m_poPkt(0)
	, m_eCallbackReason(eSktCallbackReasonUnknown)
	, m_rcError(0)
{
}
//=== constructor ===//
RcSysRxEvent::RcSysRxEvent( RcSktBase * poSkt, VxPktHdr * poPkt, ESktCallbackReason eCallbackReason, RCODE rc )
	: m_poSkt(poSkt)
	, m_eCallbackReason(eCallbackReason)
	, m_rcError(rc)
{
	if( poPkt )
	{
		m_poPkt = (RcSysPktHdr *)poPkt->MakeCopy();
	}
	else
	{
		m_poPkt = NULL;
	}
}
//============================================================================
//=== destructor ===//
RcSysRxEvent::~RcSysRxEvent()
{
	if( m_poPkt )
	{
		delete m_poPkt;
	}
}
//============================================================================
//=== constructor ===//
RcSysSktRxEventQue::RcSysSktRxEventQue()
{
}
//============================================================================
//=== destructor ===//
RcSysSktRxEventQue::~RcSysSktRxEventQue()
{
	RcSysRxEvent * poEvent;
	int iCnt = (int)m_aoRxEvents.size();
	for( int i = 0; i < iCnt; i++ )
	{
		poEvent = m_aoRxEvents[i];
		delete poEvent;
	}
	m_aoRxEvents.clear();
}

//============================================================================
//=== methods ===//
//============================================================================
//============================================================================
//! add event to que
void RcSysSktRxEventQue::AddSktRxEvent( RcSysRxEvent * poEvent )
{
	if( MAX_RC_SYS_SKT_EVENTS > m_aoRxEvents.size() )
	{
		m_oRxEventMutex.Lock();
		m_aoRxEvents.push_back( poEvent );
		m_oRxEventMutex.Unlock();
	}
	else
	{
		delete poEvent;
	}
}
//============================================================================
//! remove event from que.. returns null if no events avalil
RcSysRxEvent *	RcSysSktRxEventQue::RemoveSktRxEvent(  void )
{
	RcSysRxEvent* poEvent = NULL;
	if( m_aoRxEvents.size() )
	{
		poEvent = m_aoRxEvents[0];
		m_aoRxEvents.erase( m_aoRxEvents.begin());
		return poEvent;
	}
	return NULL;
};



